package Screens;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import Botao.BotaoDeEstado;
import Botao.BotaoSimples;
import Main.GamePanel;
import Paineis.PainelDeGerenciamento;
import Towers.GerenciadorDeTorres;
import Towers.Tower;
import Utils.Constantes;
import Utils.Sprite;
import Utils.Utilidades;
import enemies.Enemy;

public class TelaTreinamento extends Screen {


	public static ArrayList<Tower>listasDeTorresTreinamento = new ArrayList<Tower>();
	/**
	 * Lista de torres que vao estar ativas no cenario.
	 */
	public PainelDeGerenciamento PainelLateral;
	/**
	 * Painel de gerenciamento de criacao de torres 
	 */

	Font font = new Font("Times New Roman", Font.BOLD, 15);
	Font fontTrocaWave = new Font("Times New Roman", Font.BOLD, 60);
	Font fontTrocaDebriefing = new Font("Times New Roman", Font.BOLD, 30);
	Font anterior;
	int contador=0;
	Tower torre;

	BufferedImage materialSelecionado;
	int tipoMaterial;
	int mouseX;
	int mouseY;
	/** variaveis para controlar o mouse dentro do painel 
	 * auxX e auxY	 */	
	int auxX;
	int auxY;
	int valor =0;
	/**
	 torre usada para ser mostrada no painel e quando confirmada 
	 vai ser debitado do dinheiro do jogador
	 depois adcionada na lista de torres do jogador
	 e depois fica nula para nao ser mais desenhada
	 */

	GerenciadorDeTorres gerenciadorDeTorreCriada;	
	//public static final int nroInimigos = 10;
	public static boolean liberouWave = false;
	//	Enemy inimigo;
	ArrayList< Sprite>listaDeSprites;
	Tower torreBasica;
	public static int lifeBase = 50;
	public final int lifeBaseMax = lifeBase;
	public boolean mouseOverGrid = false;
	public boolean inicializoConstrucao = false;
	// bruno 
	public int valorTorreParaVenda;
	public int valorTorreReparo;
	public int indiceTorreSelecionada;	
	//  variaveis da tela brifing
	
	public final BufferedImage telaBriefing;
//	public boolean inBriefing;
	int timerBriefing;
	final int limiteTimeBriefing = 10000;
	BotaoSimples botaoSkipBriefing;
	BotaoDeEstado botaoEstadoSom;


	final BufferedImage listaDeNomeDeFases;
	final String  listaDeEndNomesFases;
	final BufferedImage listaDeImagemDeFases;
	final String  listaDeEndImagemDeFases;
	boolean pause = false;
	BufferedImage telaPause;
	
	// elementos para treinamento 

	boolean fimTreinamento;
	BufferedImage imageTextoTelaBriefing;
	BufferedImage[]imageSeta= new BufferedImage[3];
	
	int indiceDica =0;	
	int frame =0;
	final int delay = 150;
	int contadorTempo;
	int contadorParaStatus;
	final int delayStatus = 700;
	int posicaoStatus;
	int indiceTorrePasso10;
	int indiceTorrePasso5;
	
	// Barra inferior 
	
	BufferedImage barra;
	BotaoSimples botaoNextWave;
	BotaoSimples botaoPause;
	BufferedImage telaInfo;
	// tela troca de wave
	
	final int INICIO= 0;
	final int TROCA_WAVE = 1;
	final int JOGO = 2;
	final int DEBRIFING = 3;
	final int BUILDS_TORRES = 4;

	
	int faseJogo;
	int timerTrocaWave;
	final int timerDeTrocaDeWave = 7000;
	int contadorTrocaWave;
	
	BotaoSimples botaoSkipTrocaWave;
	BufferedImage frase;
	int timerFrase;
	int tempoDeTimerDeFrase = 20000;
	TelaTorresLiberada telaBilds;
	BotaoSimples botaoBuildTorres;
	BotaoSimples botaoCloseBuilds;
	// 
	final int RESULTADO = 5;
	BufferedImage imageNulaTorre;
	int contadorTempoResultado;
	final int delayResultado = 4000;
	boolean winWave;
	BufferedImage waveWin;
	// bruno dia 02/12
	int totalInimigos;
	int totalInimigosMortos;
	int totalDeTorreCriadas;
	int totalDeTorresDestroidas;
	final BufferedImage telaDebriefing;
	int valorBonusInimigos = 50;
	int valorBonusTorres = 60;
	int valorBonusCastelo = 100;
	BotaoSimples botaoCloseDebriefing;
	boolean estadoAnteriorSom;

	

	public TelaTreinamento(int X, int Y, int Width, int Height, String fileNome) {
		super(X, Y, Width, Height, fileNome);

		frase = Utilidades.LoadImage("/dicas/frase.png");
		telaInfo = Utilidades.LoadImage("/telas/tela_entre_waves.png");
		imageTextoTelaBriefing = Utilidades.LoadImage("/dicas/dica1.PNG");
		
		imageSeta[2] =  Utilidades.LoadImage("/dicas/dica2_0.png");
		imageSeta[1] =  Utilidades.LoadImage("/dicas/dica2_1.png");
		imageSeta[0] =  Utilidades.LoadImage("/dicas/dica2_2.png");
		PainelLateral = new PainelDeGerenciamento(720, -2, 182, 502, "/painel.png");
		barra = Utilidades.LoadImage("/telas/barra_inferior.png");
		botaoNextWave = new BotaoSimples(550, 482, "/botoes/botao_next_wave.png", "/botoes/botao_next_wave_over.png");
		botaoPause = new BotaoSimples(50, 482, "/botoes/botao_pause.png", "/botoes/botao_pause_over.png");
		inicializaTudo();
		
		telaBriefing = Utilidades.LoadImage("/telas/tela_briefing.png");

		botaoSkipBriefing = new BotaoSimples(860, 5, "/botoes/botao_exit.png", "/botoes/botao_exit_over.png");
		botaoSkipTrocaWave = new BotaoSimples(680, 5, "/botoes/botao_exit.png", "/botoes/botao_exit_over.png");
		
		botaoEstadoSom = new BotaoDeEstado(10, 485, "/botoes/icone_som_on.png", "/botoes/icone_som_off.png");
		/**
		 * inicializando endereco de imagens que vao ser mostra
		 * no inicio de cada fase e juntamente com a paisagem corespondente
		 * 
		 */
		telaPause = Utilidades.LoadImage("/telas/tela_pause.png");
	
		listaDeEndNomesFases = "/telas/Beltame.png";
		listaDeEndImagemDeFases = "/telas/planice.png";
		listaDeImagemDeFases = Utilidades.LoadImage(listaDeEndImagemDeFases);
		listaDeNomeDeFases = Utilidades.LoadImage(listaDeEndNomesFases);
		telaBilds = new TelaTorresLiberada(0, 0, 900, 500, "/telas/builds_torres.png");
		botaoBuildTorres = new BotaoSimples(300, 482, "/botoes/botao_build_torre.png", "/botoes/botao_build_torre_over.png");
		botaoCloseBuilds = new BotaoSimples(820, 5, "/botoes/botao_exit.png", "/botoes/botao_exit_over.png");
		imageNulaTorre = Utilidades.LoadImage("/torres/x.png");
		waveWin = Utilidades.LoadImage("/dicas/wave_winner.png");
		//
		telaDebriefing = Utilidades.LoadImage("/telas/debriefing.png");
		botaoCloseDebriefing = new BotaoSimples(820, 5, "/botoes/botao_exit.png", "/botoes/botao_exit_over.png");

	}
	public void inicializaTudo(){
		GamePanel.money = GamePanel.moneyInicial;
		gerenciadorDeTorreCriada = new GerenciadorDeTorres();
		listasDeTorresTreinamento = new ArrayList<Tower>();
		inicializaSprites();
		Constantes.ListaInimigos = new ArrayList<Enemy>();
		liberouWave = false;
//		inBriefing = true;
		timerBriefing = 0;
		lifeBase = 50;
		indiceTorreSelecionada =-1;
		valorTorreParaVenda =0;
		valorTorreReparo = 0;
		pause = false;
		inicializaTorreBasica();
		inicializaSprites();
		resetaSelecao();
		resetaSelecaoTorreFixada();
		resetaSelecaoTorreNoCenario();
		
		fimTreinamento = false;
		indiceDica =0;
		frame =0;
		contadorTempo = 0;
		contadorParaStatus = 0;
		posicaoStatus =0;
		faseJogo = INICIO;
		timerTrocaWave =0;		 
		contadorTrocaWave =0;
		timerFrase =0;
		winWave = false;
		contadorTempoResultado =0;
		totalInimigos =0;
		totalInimigosMortos =0;
		totalDeTorreCriadas =0 ;
		totalDeTorresDestroidas =0;
	}



	public void inicializaTorreBasica(){
		//		PainelLateral.prontoPraVenda = true;
		torreBasica =  new Tower(Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).x, 
				Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).y, 32, 32, 0);
	}

	public void inicializaSprites(){
		listaDeSprites = new ArrayList<Sprite>();
		for(int i = 0; i<9; i++){
			listaDeSprites.add(new Sprite(736+((i%3)*25), 232+((i/3)*25), 25, 25, null, false));
		}
	}



	@Override
	public void Draw(Graphics2D dbg) {
		
		
		switch(faseJogo){
		case INICIO:
			dbg.drawImage(telaBriefing, 0, 0, null);
			dbg.drawImage(listaDeNomeDeFases, 430, 20, null);
			dbg.drawImage(listaDeImagemDeFases, 505, 136, null);
			//dbg.drawImage(imageTextoTelaBriefing, 112, 230, null);
			dbg.drawImage(Constantes.listaDeBuildsTorres.get(0), 103, 150, null);
			dbg.drawImage(Constantes.listaDeBuildsTorres.get(1), 191, 150, null);
			dbg.drawImage(Constantes.listaDeBuildsTorres.get(2), 279, 150, null);
			botaoSkipBriefing.Draw(dbg);
		
			break;
		case TROCA_WAVE:
			//TODOaanterior = dbg.getFont();
			dbg.setFont(fontTrocaWave);
			dbg.drawImage(telaInfo, 0, 0, null);
			dbg.drawImage(listaDeNomeDeFases, 260, 30, null);
			dbg.setColor(Color.WHITE);
			dbg.drawString(""+(Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual+1)+" - "+Constantes.listaMapas.get(Constantes.mapaAtual).listaWaves.size(), 180, 210);
//			dbg.drawString(""+Constantes.listaMapas.get(Constantes.mapaAtual).quantidadeTotalInimigos, 190, 390);
			dbg.drawString(""+Constantes.ListaInimigos.size(), 190, 390);
			dbg.setFont(font);
			PainelLateral.Draw(dbg);
			dbg.setColor(Color.RED);
			dbg.drawString(""+lifeBase, 770, 15);
			botaoSkipTrocaWave.Draw(dbg);
			dbg.drawImage(barra, 0, 480, null);
			botaoNextWave.Draw(dbg);
			botaoEstadoSom.Draw(dbg);
			botaoPause.Draw(dbg);
			dbg.setFont(anterior);
			break;
		case JOGO:
			anterior = dbg.getFont();
			dbg.setFont(font);

			dbg.drawImage(Constantes.listaDeImagemCenario.get(Constantes.mapaAtual), 0, 0, null);
			PainelLateral.Draw(dbg);
			for (int i = 0; i < listasDeTorresTreinamento.size(); i++) {
				listasDeTorresTreinamento.get(i).Draw(dbg);
//				System.out.println("Torre "+listasDeTorresTreinamento.get(i));

			}		
			for(int j =0; j<listaDeSprites.size(); j++){
				if(listaDeSprites.get(j).selecionado){
					dbg.drawImage(listaDeSprites.get(j).imagem, listaDeSprites.get(j).x,listaDeSprites.get(j).y, null);
				}
			}		
			if(materialSelecionado!=null){			
				dbg.drawImage(materialSelecionado, mouseX-(materialSelecionado.getWidth()/2), mouseY-(materialSelecionado.getHeight()/2), null);
			}
			dbg.setColor(Color.RED);
			dbg.drawString(""+lifeBase, 770, 15);


			if(torre!=null){
				
				dbg.drawImage(torre.imagemDemonstracao, 736, 310, null);
				dbg.setColor(Color.WHITE);
				dbg.drawString(""+torre.life, 821, 260);
				dbg.drawString(""+(torre.damage+torre.bonusAtaque), 821, 297);
				dbg.drawString(""+(torre.range+torre.bonusRange), 821, 335);
				dbg.drawString(""+torre.custo, 821, 370);
			}
			if(indiceTorreSelecionada!=-1){		
				PainelLateral.torreSelecionada = true;
				if(listasDeTorresTreinamento.get(indiceTorreSelecionada).selecionadoNoCenario){
				
					dbg.drawImage(listasDeTorresTreinamento.get(indiceTorreSelecionada).imagemDemonstracao, 736, 310, null);
					dbg.setColor(Color.WHITE);
					dbg.drawString(""+listasDeTorresTreinamento.get(indiceTorreSelecionada).life, 821, 260);
					dbg.drawString(""+(listasDeTorresTreinamento.get(indiceTorreSelecionada).damage+listasDeTorresTreinamento.get(indiceTorreSelecionada).bonusAtaque), 821, 297);
					dbg.drawString(""+(listasDeTorresTreinamento.get(indiceTorreSelecionada).range+listasDeTorresTreinamento.get(indiceTorreSelecionada).bonusRange), 821, 335);
					
					dbg.setColor(Color.RED);
					dbg.drawString(""+valorTorreReparo, 805, 478);
					dbg.drawString(""+valorTorreParaVenda, 805, 450);
					

				}
			}else{
				if(torre==null){
					dbg.drawImage(imageNulaTorre, 736, 310, null);
				}
				PainelLateral.torreSelecionada = false;
			}
			
			dbg.drawImage(barra, 0, 480, null);
			if (liberouWave) {
				for (int i = 0; i < Constantes.ListaInimigos.size(); i++) {
					Constantes.ListaInimigos.get(i).DesenhaSe(dbg);
				}
			}else{
				botaoNextWave.Draw(dbg);
			}
			
			botaoEstadoSom.Draw(dbg);
			botaoPause.Draw(dbg);
			botaoBuildTorres.Draw(dbg);
			if(!fimTreinamento){
				
				switch(indiceDica){
				case 1:
					dbg.drawImage(imageSeta[frame], 765, 164, null);
//					indiceDica =16;
					break;
				case 2:
					//130, 240
//					// desenha no status
					dbg.drawImage(imageSeta[frame], 850, 240+(posicaoStatus*37), null);
					break;
				case 3:
					// desenha no botao corfirma
					dbg.drawImage(imageSeta[frame], 795, 375, null);
					break;
				case 4:	
					// desenha na posicao onde a torre � colocada no mapa
					dbg.drawImage(imageSeta[frame], 680, 420, null);
					break;
				case 5:	
					// mosta a posicao do mapa pra colocar a torre 
					// mais aceita que seja colocada em outro lugar valido 
					dbg.drawImage(imageSeta[frame], 349, 200, null);
					
					if(listasDeTorresTreinamento.get(indiceTorrePasso5).fixada){
						indiceDica ++;
					}
					
					
					break;
				case 6:	
					// mosta no painel para selecionar icone da madeira
					dbg.drawImage(imageSeta[frame], 765, 70, null);
					break;
				
				case 7:
					// mostra pra colocar no grid na 3 linha na 1 coluna
					dbg.drawImage(imageSeta[frame], 753, 268, null);
					break;
				case 8:		
					// mosta no painel para selecionar icone da pedra
					dbg.drawImage(imageSeta[frame], 765, 97, null);
					break;
				case 9:		
					// mostra pra colocar no grid na 3 linha na 3 coluna
					dbg.drawImage(imageSeta[frame], 798, 268, null);
					break;
				case 10:
					// desenha no botao corfirma
					dbg.drawImage(imageSeta[frame], 795, 375, null);
					break;
					//
										
				case 11:
					 // desenha na posicao onde a torre � colocada no mapa
					dbg.drawImage(imageSeta[frame], 680, 420, null);
					if(listasDeTorresTreinamento.get(indiceTorrePasso10).selecionada){
						indiceDica++;
						
					}
					
					break;
				case 12:
					// mosta a posicao do mapa pra colocar a torre 
					// mais aceita que seja colocada em outro lugar valido 
					dbg.drawImage(imageSeta[frame], 420, 250, null);
					
					if(listasDeTorresTreinamento.get(indiceTorrePasso10).fixada){
						indiceDica ++;
						
//						fimTreinamento = true;
						
					}
					break;
				case 13:	
					// mosta no painel para selecionar icone da madeira
					if(listasDeTorresTreinamento.size()>0){
						dbg.drawImage(imageSeta[frame],listasDeTorresTreinamento.get(indiceTorrePasso5).x , listasDeTorresTreinamento.get(indiceTorrePasso5).y-16, null);
						if(listasDeTorresTreinamento.get(indiceTorrePasso5).selecionadoNoCenario){
							indiceDica++;
							
						}
					}
					
					break;
				case 14: 
					dbg.drawImage(imageSeta[frame], 780, 430, null);
					if(PainelLateral.botaoSell.selecionada){
						indiceDica++;
					}
					
					break;
				case 15: 
					dbg.drawImage(imageSeta[frame], 670, 470, null);
					
					break;
				case 16: 
					if(timerFrase>tempoDeTimerDeFrase){
						timerFrase = 0;
						fimTreinamento = true;
					}
					if(frame==2){
						dbg.drawImage(frase, 280, 40, null);
					}
					
					
					break;
				
				}// end switch
			
			}			
			dbg.setFont(anterior);
			break;
			case DEBRIFING: 
				// total 
				anterior = dbg.getFont();
				dbg.setFont(fontTrocaDebriefing);
				dbg.drawImage(telaDebriefing, 0, 0, null);
				dbg.drawString(""+totalInimigos, 575, 185);
				dbg.drawString(""+totalInimigosMortos, 575, 220);
				dbg.drawString(""+totalDeTorreCriadas, 575, 245);
				
				dbg.drawString(""+(totalDeTorresDestroidas), 575, 275);
				dbg.drawString(""+lifeBase, 575, 305);
				// bonus
				//dbg.drawString(""+totalInimigos, 715, 185);
				if(totalInimigosMortos== totalInimigos){
					dbg.drawString(""+valorBonusInimigos, 715, 220);
				}
				//dbg.drawString(""+totalDeTorreCriadas, 715, 245);
				if(listasDeTorresTreinamento.size()== totalDeTorreCriadas){
					dbg.drawString(""+valorBonusTorres, 715, 275);
				}
				if(lifeBase == lifeBaseMax){
					dbg.drawString(""+valorBonusCastelo, 715, 305);
				}
				dbg.drawString(""+(valorBonusCastelo+valorBonusInimigos+valorBonusTorres), 620, 380);
				botaoCloseDebriefing.Draw(dbg);
				dbg.setFont(anterior);
				// falta o valor final mais tem que aumentar a letra da fonte
				break;
			case BUILDS_TORRES:
				telaBilds.Draw(dbg);
				botaoCloseBuilds.Draw(dbg);
				break;
			case RESULTADO:
				dbg.drawImage(Constantes.listaDeImagemCenario.get(Constantes.mapaAtual), 0, 0, null);
				PainelLateral.Draw(dbg);
				for (int i = 0; i < listasDeTorresTreinamento.size(); i++) {
					listasDeTorresTreinamento.get(i).Draw(dbg);

				}		
				for(int j =0; j<listaDeSprites.size(); j++){
					if(listaDeSprites.get(j).selecionado){
						dbg.drawImage(listaDeSprites.get(j).imagem, listaDeSprites.get(j).x,listaDeSprites.get(j).y, null);
					}
				}		
				if(materialSelecionado!=null){			
					dbg.drawImage(materialSelecionado, mouseX-(materialSelecionado.getWidth()/2), mouseY-(materialSelecionado.getHeight()/2), null);
				}
				dbg.setColor(Color.RED);
				dbg.drawString(""+lifeBase, 770, 15);
//				dbg.setColor(Color.GREEN);
//				dbg.fillRect(648, 473, (int) (50.0f*lifeBase / lifeBaseMax), 5);
//				dbg.setColor(Color.BLACK);
//				dbg.drawString(, 673, 493);

				if(torre!=null){
					
					dbg.drawImage(torre.imagemDemonstracao, 736, 310, null);
					dbg.setColor(Color.WHITE);
					dbg.drawString(""+torre.life, 821, 260);
					dbg.drawString(""+(torre.damage+torre.bonusAtaque), 821, 297);
					dbg.drawString(""+(torre.range+torre.bonusRange), 821, 335);
					dbg.drawString(""+torre.custo, 821, 370);
				}else{
					dbg.drawImage(imageNulaTorre, 736, 310, null);
				}
				
				dbg.drawImage(barra, 0, 480, null);
				
				if (liberouWave) {
					for (int i = 0; i < Constantes.ListaInimigos.size(); i++) {
						Constantes.ListaInimigos.get(i).DesenhaSe(dbg);
					}
				}else{
					botaoNextWave.Draw(dbg);
				}
				
				botaoEstadoSom.Draw(dbg);
				botaoPause.Draw(dbg);
				botaoBuildTorres.Draw(dbg);
				
				if(winWave){
					dbg.drawImage(waveWin, 235, 165, null);
				}
				break;
			
			
		}

		
		if(pause){
			dbg.drawImage(telaPause, 0, 0, null);
		}

	}

	@SuppressWarnings("static-access")
	@Override
	public void Update(long diffTime) {
			
		if(!pause){
			contadorTempo+=diffTime;
			if(indiceDica==16){
				timerFrase+=diffTime;
			}
			frame = (int)(contadorTempo/delay)%3;
			switch (faseJogo) {
			case INICIO:
				timerBriefing +=diffTime;			
				if( botaoSkipBriefing.selecionada){
					faseJogo = TROCA_WAVE;
					
					timerBriefing = 0;
					botaoSkipBriefing.selecionada = false;
					botaoSkipBriefing.mouseOver = false;
					indiceDica++;
				
				}
				break;
			case TROCA_WAVE:
				timerTrocaWave+=diffTime;
				
				if(botaoSkipTrocaWave.selecionada){
					timerTrocaWave =0;	
					totalInimigos += Constantes.ListaInimigos.size();
				
					botaoSkipTrocaWave.selecionada = false;
					botaoSkipTrocaWave.mouseOver = false;
					faseJogo = JOGO;
					valor =0;
					torre = null;
					inicializaSprites();
					resetaSelecao();
					inicializaSprites();
					resetaSelecaoTorreNoCenario();
					
				}
				
				break;
			
			case JOGO:
				if(indiceDica==2){
					 contadorParaStatus+=diffTime;
					 if(contadorParaStatus>delayStatus){
						 contadorParaStatus = 0;
						 posicaoStatus ++;
						 if(posicaoStatus>3){
							 posicaoStatus = 0;
							 contadorParaStatus = 0;
//							
							 indiceDica++;
							
						 }
					 }
					
				}
//				testaBotoes();
				

				if (liberouWave) {
					
					for (int i = 0; i < Constantes.ListaInimigos.size(); i++) {
						Constantes.ListaInimigos.get(i).SimulaSe(diffTime);
						if (!Constantes.ListaInimigos.get(i).vivo) {
							if(!Constantes.ListaInimigos.get(i).isSuicidio){
								GamePanel.money+=Constantes.ListaInimigos.get(i).recompensa;
//								System.out.println("recomensa que ta passando  tela treinamento"+Constantes.ListaInimigos.get(i).recompensa);
								totalInimigosMortos++;
							}
							Constantes.ListaInimigos.remove(i);
							if (Constantes.ListaInimigos.size()==0){
								liberouWave = false;
								if(lifeBase>0){
									winWave = true;
								}
								faseJogo = RESULTADO;
//								
								Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual++;
								if (Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual<Constantes.listaMapas.get(Constantes.mapaAtual).listaWaves.size()){
									Constantes.listaMapas.get(Constantes.mapaAtual).carregaWave(Constantes.listaMapas.get(Constantes.mapaAtual).waveAtual);
								} else{
										totalDeTorresDestroidas +=totalDeTorreCriadas-listasDeTorresTreinamento.size();
										faseJogo = DEBRIFING;
										break;					
									
								}
							}
						}
					}
				}
			
				for (int j = 0; j < listasDeTorresTreinamento.size(); j++) {
					if (listasDeTorresTreinamento.get(j).fixada) {
						if (listasDeTorresTreinamento.get(j).viva){
							listasDeTorresTreinamento.get(j).Update(diffTime);
						} else {
							if(j == indiceTorreSelecionada)
								indiceTorreSelecionada =-1;
							listasDeTorresTreinamento.remove(j);
						}
					}
				}			
				break;	
			case RESULTADO:
				contadorTempoResultado+=diffTime;
				if(contadorTempoResultado>delayResultado){
					contadorTempoResultado = 0;
					
					winWave = false;
					faseJogo = TROCA_WAVE;
					
				}
				break;
			}// end switch
			if(lifeBase<1){
				inicializaTudo();
				GamePanel.instance.TELA_ATIVA = GamePanel.instance.TELA_GAME_OVER;
				//TODO
				Constantes.soundplayer.Stop();
				Constantes.soundplayer.playTrack(Constantes.BGM_TELA_GAME_OVER);
			}
		}// end pause		
		
	}

	public void testaBotoes(){
		if(auxX>720){
			
			if(PainelLateral.botaoConfirm.selecionada){
				
					if(indiceDica==3||indiceDica==10){
						indiceDica++;
						
					}
					materialSelecionado = null;
					PainelLateral.botaoConfirm.selecionada = false;
					PainelLateral.botaoTorre.selecionada = false;
					if(torre!=null){
					
						if(GamePanel.money-torre.custo>-1){
							criaTorreBasica(torre);
							totalDeTorreCriadas++;
							
							//valor=0;
							//torre = null;
							//inicializaSprites();
							resetaSelecao();
							
							resetaSelecaoTorreNoCenario();						
						}else{
							Constantes.soundplayer.playTrack(Constantes.SFX_PUNCH);
						}
	
					}
				
			}
			if(PainelLateral.botaoTorre.selecionada){
				PainelLateral.botaoTorre.selecionada = false;
				inicializaTorreBasica();
				valor=0;
				torre = torreBasica;
				if(indiceDica==1){
					
					indiceDica++;
					
				}
				
				materialSelecionado = null;
				inicializaSprites();
				resetaSelecaoTorreFixada();	
				

			}
			if(PainelLateral.botaoCancel.selecionada){
				valor=0;
				PainelLateral.botaoCancel.selecionada = false;
				resetaSelecao();
				inicializaSprites();
				resetaSelecaoTorreNoCenario();
				if(indiceDica==2){
					indiceDica =1;
					
					posicaoStatus = 0;
					contadorParaStatus =0;
				}
			

			}

			if(PainelLateral.botaoMadeira.selecionada){
				
				tipoMaterial = gerenciadorDeTorreCriada.MADEIRA;
				materialSelecionado = PainelLateral.botaoMadeira.imagemNormal;			
				PainelLateral.botaoMadeira.selecionada= false;	
//			
				resetaSelecaoTorreFixada();
				if(indiceDica==6){
					indiceDica++;
				
				}

			}

			if(PainelLateral.botaoPedra.selecionada){
				PainelLateral.botaoPedra.selecionada = false;
				tipoMaterial = gerenciadorDeTorreCriada.PEDRA;
				materialSelecionado = PainelLateral.botaoPedra.imagemNormal;			
					
				resetaSelecaoTorreFixada();
				if(indiceDica==8){
					indiceDica++;
					
				}

			}

			if(PainelLateral.botaoMetal.selecionada){
				PainelLateral.botaoMetal.selecionada = false;
				tipoMaterial = gerenciadorDeTorreCriada.METAL;
				materialSelecionado = PainelLateral.botaoMetal.imagemNormal;
				resetaSelecaoTorreFixada();
			}

			if(PainelLateral.botaoSell.selecionada){
				removeTorre();
				totalDeTorresDestroidas --;
				PainelLateral.botaoSell.selecionada = false;
				if(indiceDica==14){
					indiceDica++;					
				}
				
				Constantes.soundplayer.playTrack(Constantes.SFX_THROW);
			}
			if(PainelLateral.botaoRepair.selecionada){
				

				if(indiceTorreSelecionada!=-1){
					if(listasDeTorresTreinamento.get(indiceTorreSelecionada).life<listasDeTorresTreinamento.get(indiceTorreSelecionada).lifeMax){
						GamePanel.money-=valorTorreReparo;					
						reparaTorre(indiceTorreSelecionada);
					}

				}
				PainelLateral.botaoRepair.selecionada = false;

			}
		}
	}

	private void reparaTorre(int indice) {

		listasDeTorresTreinamento.get(indice).constroiTorre(listasDeTorresTreinamento.get(indice).tipoDaTorre);		
	}

	public void CriaTorre(){
		int resultado =gerenciadorDeTorreCriada.testaTorre(valor);	
		if(resultado!=-1){
			//System.out.println("linha 656 = "+Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).x);
			torre =  new Tower(Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).x, 
					Constantes.listaDePosicoesIniciais.get(Constantes.mapaAtual).y, 32, 32, resultado);
			
		}else{
			if(torre!=torreBasica){

				torre = null;
			}			
		}
	}

	public void resetaSelecaoTorreNoCenario(){
		for(int i=0; i<listasDeTorresTreinamento.size(); i++){
			listasDeTorresTreinamento.get(i).selecionadoNoCenario = false;
		}
	}

	public void resetaSelecao(){
		torre = null;
		materialSelecionado = null;
		tipoMaterial = -1;
	}

	@SuppressWarnings("static-access")
	@Override
	public void tratadorTecladoPress(KeyEvent e) {

		int keyCode = e.getKeyCode();

		switch (keyCode) {
		case KeyEvent.VK_P:
			pause = !pause;
			break;
		case KeyEvent.VK_ESCAPE:
			inicializaTudo();
			Constantes.soundplayer.Stop();			
			Constantes.soundplayer.playTrack(Constantes.BGM_INTRO);
			GamePanel.instance.TELA_ATIVA = GamePanel.instance.TELA_INICIAL;

			break;
		case KeyEvent.VK_1:
			//			Constantes.soundplayer.playTrack(0);
			break;
		case KeyEvent.VK_2:
			//			Constantes.soundplayer.playTrack(1);
			break; 
		case KeyEvent.VK_3:
			//			Constantes.soundplayer.playTrack(2);
			break;
		case KeyEvent.VK_4:
			//			Constantes.soundplayer.playTrack(3);
			break;
		case KeyEvent.VK_W:
			liberouWave = true;
			break;
		}
	}

	@Override
	public void tratadorTecladoReleased(KeyEvent e) {

	}

	@Override
	public void mouseMoved(MouseEvent e) {
		botaoPause.mouseMoved(e);
		if(!pause){
			switch (faseJogo) {
			case INICIO:
				botaoSkipBriefing.mouseMoved(e);
				break;
			case TROCA_WAVE:
				if(timerDeTrocaDeWave>200){
					botaoSkipTrocaWave.mouseMoved(e);
				}
				break;
			case JOGO:

				PainelLateral.mouseMoved(e);
				botaoEstadoSom.mouseMoved(e);
				
				botaoNextWave.mouseMoved(e);
				botaoBuildTorres.mouseMoved(e);
				auxX = e.getX();
				auxY = e.getY();
				testeDeMouseDentroDoPainel(auxX, auxY);
				for (int i = 0; i < listasDeTorresTreinamento.size(); i++) {
					listasDeTorresTreinamento.get(i).mouseMove(e);
				}
				break;
			case BUILDS_TORRES:
				telaBilds.mouseMoved(e);
				botaoCloseBuilds.mouseMoved(e);
				break;
			case DEBRIFING:
				botaoCloseDebriefing.mouseMoved(e);
			break;
			}			
		}
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		botaoPause.mouseDragged(e);
		if(!pause){
			switch (faseJogo) {
			case INICIO:
				botaoSkipBriefing.mouseMoved(e);
				break;
			case TROCA_WAVE:				
					botaoSkipTrocaWave.mouseMoved(e);				
				break;
			case JOGO:
				botaoNextWave.mouseDragged(e);
				botaoEstadoSom.mouseDragged(e);
				auxX = e.getX();
				auxY = e.getY();
				testeDeMouseDentroDoPainel(auxX, auxY);

				for (int i = 0; i < listasDeTorresTreinamento.size(); i++) {
					listasDeTorresTreinamento.get(i).mouseMove(e);
				}
				break;
			
			}
		}
	}

	public void testeDeMouseDentroDoPainel(int auxX,int auxY){
		if(auxX>733 && auxX<888){
			if(auxY>12 && auxY<488){
				mouseX = auxX;
				mouseY = auxY;
				if(Utilidades.ColisaoRetangular(720, 48, 900, 387, mouseX, mouseY, mouseX+1, mouseY+1)){

					mouseOverGrid = true;
				}else{
					if(mouseOverGrid){
						liberaMaterialSelecionado();
						mouseOverGrid = false;
					}
				}
			}else{
				materialSelecionado = null;
			}
		}else{
			materialSelecionado = null;
		}
	}

	@Override
	public void mouseReleased(MouseEvent e) {


	}

	@Override
	public void mousePressed(MouseEvent e) {
		
	}

	@Override
	public void mouseExited(MouseEvent e) {

	}

	@Override
	public void mouseEntered(MouseEvent e) {


	}

	//TODO
	
	@SuppressWarnings("static-access")
	@Override
	public void mouseClicked(MouseEvent e) {
		botaoPause.mouseClicked(e);
		if(botaoPause.selecionada){
			botaoPause.selecionada = false;
			botaoPause.mouseOver = false;
			pause = !pause;
		}
		if(!pause){
			switch (faseJogo) {
			case INICIO:	
				botaoSkipBriefing.mouseClicked(e);
				break;
			case DEBRIFING:
				botaoCloseDebriefing.mouseClicked(e);
				if(botaoCloseDebriefing.selecionada){
					botaoCloseDebriefing.selecionada = false;
					inicializaTudo();					
					Constantes.mapaAtual = 0;//	
					//TODO
					// mudar 
					Constantes.soundplayer.Stop(Constantes.BGM_WAVE_ESPERA);
					Constantes.soundplayer.playTrack(Constantes.BGM_TELA_WIN);
					GamePanel.instance.TELA_ATIVA = GamePanel.instance.TELA_GAME_WIN;
					
				}
				break;
			case TROCA_WAVE:
				if(timerDeTrocaDeWave>200){
					botaoSkipTrocaWave.mouseClicked(e);
				}
				break;
			case JOGO:	
				if(indiceTorreSelecionada!=-1){
					if(e.getX()<720){
						resetaSelecaoTorreFixada();
						PainelLateral.botaoCancel.selecionada = false;
					}
				}
				
			
				botaoNextWave.mouseClicked(e);
				if(botaoNextWave.selecionada){
					botaoNextWave.selecionada = false;
					botaoNextWave.mouseOver = false;
					if(!liberouWave){
						if(indiceDica==15){
							indiceDica++;

						}
						//TODO
						Constantes.soundplayer.playTrack(Constantes.SFX_LIBERA_WAVE);
						liberouWave = true;
					}
				}
				botaoBuildTorres.mouseClicked(e);
				if(botaoBuildTorres.selecionada){
					faseJogo = BUILDS_TORRES;
					botaoBuildTorres.selecionada = false;
					botaoBuildTorres.mouseOver = false;
					Constantes.soundplayer.Stop(Constantes.BGM_WAVE_ESPERA);
					Constantes.soundplayer.playTrack(Constantes.BGM_TELA_BUILD);
				}
				//TODO
				estadoAnteriorSom = botaoEstadoSom.selecionada;
				botaoEstadoSom.mouseClicked(e);
				if(botaoEstadoSom.selecionada){
					Constantes.soundplayer.Stop();
				}
				if(estadoAnteriorSom){
					if(!botaoEstadoSom.selecionada){
						Constantes.soundplayer.playTrack(Constantes.BGM_WAVE_ESPERA);
						
					}
				}

				int indice = -1;
				
				PainelLateral.mouseClicked(e);
				for (int i = 0; i < listasDeTorresTreinamento.size(); i++) {
					listasDeTorresTreinamento.get(i).mouseClik(e);
					
					if(indiceDica==4){
						if(listasDeTorresTreinamento.get(i).selecionada){
							indiceDica++;
							
						}
					}
					if(indiceDica==10){
						if(listasDeTorresTreinamento.get(indiceTorrePasso10).selecionada){
							indiceDica++;
						
						}
					}
						
					if(listasDeTorresTreinamento.get(i).selecionadoNoCenario){
						resetaSelecaoTorreNoCenario();
						indice = i;
					}
				}
				if(indice!=-1){

					listasDeTorresTreinamento.get(indice).selecionadoNoCenario = true;
				}

				atualizaGrid();
				getIndiceTorreSelecionada();
				break;
			case BUILDS_TORRES:
				botaoCloseBuilds.mouseClicked(e);
				if(botaoCloseBuilds.selecionada){
					faseJogo = JOGO;
					botaoCloseBuilds.selecionada = false;
					botaoCloseBuilds.mouseOver = false;
					Constantes.soundplayer.Stop(Constantes.BGM_TELA_BUILD);
					if(liberouWave){
						// TODO mudar 
						Constantes.soundplayer.playTrack(Constantes.BGM_WAVE_ESPERA);
					}else{
						Constantes.soundplayer.playTrack(Constantes.BGM_WAVE_ESPERA);
					}
					
				}
				break;
			}
		}
		testaBotoes();
		CriaTorre();
	}

	@Override
	public void setaOpcao(int opcao) {


	}

	public void criaTorreBasica(Tower tower){
		/** Verifica se tem alguma torre para ser colocada no mapa
		 * se tiver alguma torre ele nao deixa ser criada outra ate que aquela seja 
		 * fixada e depois faz o debito deacordo com o valor de custo da torre.
		 * e adciona na lista de torres 
		 */
		boolean autorizado = true;
		for(int i =0; i<listasDeTorresTreinamento.size(); i++){
			if(listasDeTorresTreinamento.get(i).fixada == false){
				autorizado = false;
				break;
			}		
		}
		if(autorizado){
			GamePanel.money-=tower.custo;
			
			if(indiceDica==2){
				indiceTorrePasso5 = listasDeTorresTreinamento.size();
//				
			}
			if(indiceDica==11){
				
				indiceTorrePasso10 = listasDeTorresTreinamento.size();
//				
			}
//			
			listasDeTorresTreinamento.add(tower);
			torre= null;
			
		}
	}

	public void  getIndiceTorreSelecionada(){
		indiceTorreSelecionada = -1;
		for(int i=0; i<listasDeTorresTreinamento.size(); i++){
			if(listasDeTorresTreinamento.get(i).selecionadoNoCenario){
				
				valorTorreParaVenda = (int) (listasDeTorresTreinamento.get(i).custo*(listasDeTorresTreinamento.get(i).life/listasDeTorresTreinamento.get(i).lifeMax)*0.9f);
				
				valorTorreReparo = (int)(listasDeTorresTreinamento.get(i).custo*0.7);
				
				indiceTorreSelecionada= i;
				valor=0;
				torre = null;
				inicializaSprites();
				break;
			}
		}
	}

	public void removeTorre(){

		if(indiceTorreSelecionada!=-1){
			GamePanel.money +=valorTorreParaVenda;
			
			listasDeTorresTreinamento.remove(indiceTorreSelecionada);
			indiceTorreSelecionada =-1;
		}
	}

	public void atualizaGrid(){
		/**
		 * vai verificar se tem algum material selecionado e qual posicao esta tentando colocar material 
		 * 
		 */
		if(tipoMaterial!=-1){
			// teste para ferificar se esta dentro dos grides para economizar testes
			if(mouseOverGrid){
				testaColisaoComSprite();
			}
		}
	}

	public void testaColisaoComSprite(){		
		for (int i = 0; i<listaDeSprites.size(); i++) {
			Sprite sprite  =  listaDeSprites.get(i);
			if(!sprite.selecionado){
				if(Utilidades.ColisaoRetangular(sprite.x, sprite.y, sprite.x+sprite.width, sprite.y+sprite.height,
						mouseX, mouseY, mouseX+1, mouseY+1)){
					somaTermos(i, tipoMaterial);
					listaDeSprites.get(i).imagem = materialSelecionado;
					listaDeSprites.get(i).selecionado = true;						
					break;							

				}
			}				
		}	
	}

	public void somaTermos(int quantidade, int material){
		int valorTemp =1;
		if(quantidade==0){
			valorTemp = 1;
		}else{
			for(int j=0; j<quantidade; j++){
				valorTemp *=10;

			}
		}		
		
		valor += valorTemp*material;

		if(indiceDica==7){
			if(valor ==1000000){
				indiceDica ++;
				
			}
		}
		if(indiceDica==9){
			if(valor ==201000000){
				indiceDica ++;
				
			}
		}

	}



	public void liberaMaterialSelecionado(){
		materialSelecionado = null;			
		PainelLateral.botaoPedra.selecionada= false;
		PainelLateral.botaoMadeira.selecionada = false;
		PainelLateral.botaoMetal.selecionada = false;

	}

	public void resetaSelecaoTorreFixada(){
		for (int i = 0; i < listasDeTorresTreinamento.size(); i++) {			
			listasDeTorresTreinamento.get(i).selecionadoNoCenario = false;			
		}
	}

	public void recuperaValorDaTorres(){
		
		for (int i = 0; i < listasDeTorresTreinamento.size(); i++) {
			GamePanel.money+=listasDeTorresTreinamento.get(i).custo;


		}
		listasDeTorresTreinamento = new ArrayList<Tower>();

	}





}
